//
//  NetworkBaseAPI.h
//  SLDemo
//
//  Created by bocai on 2016/12/5.
//  Copyright © 2016年 Heracles. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "NetworkResponseModel.h"
#import "NetworkUploadModel.h"
#import "NetworkConfiguration.h"

@class NetworkBaseAPI;

@protocol NetworkAPIDelegate <NSObject>

@optional

/**
 *  请求完成回调，可以获取到API的responseModel或者error
 *
 *  @param api 进行请求的API
 */
- (void)requestFinishedWithAPI:(NetworkBaseAPI *)api;

/**
 *  请求过程回调，可以获取到API的progress
 *
 *  @param api 进行请求的API
 */
- (void)requestProgressWithAPI:(NetworkBaseAPI *)api;

@end



@interface NetworkBaseAPI : NSObject

//  urlString
@property (copy, nonatomic) NSString *urlString;
//  请求方法
@property (assign, nonatomic) NetworkHTTPMethod httpMethod;
//  请求参数
@property (copy, nonatomic) NSDictionary *parameters;
//  代理
@property (weak, nonatomic) id<NetworkAPIDelegate> delegate;
//  tag
@property (assign, nonatomic) NSInteger tag;

//  服务器返回数据模型，只读
@property (readonly, nonatomic) NetworkResponseModel *responseModel;
//  服务器返回错误信息，只读
@property (readonly, nonatomic) NSError *error;
//  上传或者下载进度，只读
@property (readonly, nonatomic) NSProgress *progress;

/**
 *  创建一个请求API，类方法
 *
 *  @param urlString  API接口地址，"login"
 *  @param httpMethod API方法，"GET" "POST"
 *  @param parameters API参数
 *
 *  @return api
 */
+ (instancetype)apiWithURLString:(NSString *)urlString
                      httpMethod:(NetworkHTTPMethod)httpMethod
                      parameters:(NSDictionary *)parameters;

/**
 *  先设置代理，再使用此方法请求
 */
- (void)request;

/**
 *  设置代理同时进行请求
 *
 *  @param delegate 代理对象
 */
- (void)requestWithDelegate:(id<NetworkAPIDelegate>)delegate;

@end



//  对API的属性拓展，使用拓展可以实现特殊API的定制而不影响其他API
@interface NetworkBaseAPI (Extension)

//  加密方式
@property (assign, nonatomic) NetworkEncodeMethod encodeMethod;
//  解密方式
@property (assign, nonatomic) NetworkDecodeMethod decodeMethod;
//  接口版本
@property (copy, nonatomic) NSString *version;
//  共有请求参数，比如token，platform
@property (copy, nonatomic) NSDictionary *commonParameters;

//  上传数据模型，当要上传数据的时候需要创建此Model
@property (strong, nonatomic) NetworkUploadModel *uploadModel;

//  合成 parameters 和 commonParameters
- (NSDictionary *)transformParameters;
//  合成 urlString 和 version
- (NSString *)transformURLString;
//  加密请求参数
- (NSDictionary *)encodeParameters:(NSDictionary *)parameters;
//  解密服务器返回数据
- (id)decodeResponseObject:(id)responseObject;

@end
